Poor memory-usage characteristics are the bane of software applications. While an application runs on a computer or computing device, it uses a portion of the computer's physical memory. Physical memory is limited. Virtual memory is a conventional scheme employed in a computing environment whereby a computer's hard drive is made to appear to an application as available memory. When physical memory is exhausted, a memory manager swaps memory pages out of physical memory to the hard drive, and brings them back when they are needed again, potentially swapping other pages out in their stead. The event of fetching a missing page from disk is called a page fault. Data retrieval time from the hard drive is typically orders of magnitude greater than retrieval time from RAM (physical memory—random access memory). Accordingly, page swaps degrade an application's performance, especially when the application requires a large amount of memory, which must be synthetically created vis-à-vis page swaps.
An application's working set is a set of pages that the application has loaded into physical memory. Modern applications may have large memory footprints, which require persistent virtual-memory swaps and a large working set. Application performance could be enhanced if the memory footprint of an application could be reduced. Remedying page-fault problems can enhance the speed of computer applications.
Historically, however, evaluating an application's memory-usage characteristics and determining what modules allocated what memory has been difficult if not unavailable. No tools provided specificity with respect to what events caused certain memory manipulations, such as allocations and deallocations. Rather, one of the only metrics available may be that of memory to code. That is, total data usage can be calculated, it cannot be dissected to attribute pieces to the various system components. So, whereas total memory of an application—which typically includes many program modules—can be determined, memory usage attributable to individual modules cannot be likewise determined. This leads to an inability to adequately troubleshoot memory-usage issues.
There is a need for a tool set that can evaluate the memory-usage characteristics of a software application. Moreover, there is a need to be able to use the tool set on uninstrumented binary files.